#include <iostream>
#include <string>

using namespace std;

/*
函数重载 容易由于 默认参数 造成二义性
*/

// 函数 Swap_Func 的第一个重载版本
// 接收两个引用作为参数，用于交换两个整数的值
void Swap_Func(int &val_1, int &val_2)
{
    int temp = val_2;
    val_2 = val_1;
    val_1 = temp;
}

// 函数 Swap_Func 的第二个重载版本
// 接收三个参数，第三个参数有默认值 10，但实际交换操作仅使用前两个引用参数
// 此函数的存在可能会引起函数重载的二义性问题
void Swap_Func(int &val_1, int &val_2, int val = 10)
{
    int temp = val_2;
    val_2 = val_1;
    val_1 = temp;
}

/*
当传递的参数为常量引用时 也是可以区分
    非常量引用  ==  变量
    常量引用  ==   常量 或 表达式
*/

// 函数 Func 的第一个重载版本
// 接收一个常量引用作为参数，输出信息
void Func(const int &val)
{
    cout << "我是一号" << val << endl;
}

// 函数 Func 的第二个重载版本
// 接收一个非常量引用作为参数，输出信息
void Func(int &val)
{
    cout << "我是二号" << val << endl;
}

int main(int argc, char const *argv[])
{
    int val_int_1 = 50;
    int val_int_2 = 70;

    // 调用 Swap_Func 的第二个重载版本，传递三个参数
    Swap_Func(val_int_1, val_int_2, 10);

    // 调用 Func 的第一个重载版本，传递常量 50
    // 由于 50 是常量，编译器会调用接收常量引用的 Func 函数
    Func(50);
    Func(val_int_1);

    return 0;
}

/*
代码解释：
函数 Swap_Func 的重载问题：

    Swap_Func(int & val_1, int &val_2)：
        此函数接收两个整数的引用，将 val_1 和 val_2 的值进行交换。

    Swap_Func(int & val_1, int &val_2, int val = 10)：
        此函数也进行 val_1 和 val_2 的交换操作，但它有一个额外的参数 val，并且 val 有默认值 10。
        这里存在潜在的问题，当调用 Swap_Func 并传递两个参数时，编译器可能会产生混淆，不确定该调用哪个函数，造成二义性。
        例如，如果调用 Swap_Func(val_int_1, val_int_2);，编译器可能不知道是调用第一个重载函数还是使用第二个重载函数的默认参数。

函数 Func 的重载及调用：
    Func(const int & val)：
        此函数接收一个常量引用，当传递常量或表达式时，编译器会优先调用此版本。

    Func(int & val)：
        此函数接收一个非常量引用，当传递变量时，编译器会调用此版本。
        在 main 函数中调用 Func(50);：
        因为 50 是一个常量，编译器会调用 Func(const int & val) 这个版本，输出 "我是一号" + 50 的信息。
*/